﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Globalization;

namespace CapaPresentacion.Controles
{
    class NuevaCategoriaGastoViewModel
    {
        

         public event ReiniciarCU ReiniciarCU;

        #region Variables

        private CategoriaGasto categoriaGasto;
        private CategoriaGasto categoriaGastoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        #endregion

        #region Propiedades

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public CategoriaGasto CategoriaGasto
        {
            get { return categoriaGasto; }
            set { categoriaGasto = value; }
        }

        #endregion

        public NuevaCategoriaGastoViewModel()
        {

            this.categoriaGasto = new CategoriaGasto();
            this.categoriaGasto.Eliminada = false;
            this.saveCommand = new RelayCommand(GuardarCategoriaGasto);
            this.newCommand = new RelayCommand(NuevaCategGasto);
            this.openCommand = new RelayCommand(AbrirCategoriaGasto);
                        
        }


        public NuevaCategoriaGastoViewModel(CategoriaGasto entidad)
        {
            this.categoriaGasto = entidad;
            this.categoriaGastoSinModificaciones = (CategoriaGasto)entidad.Clone();
            this.saveCommand = new RelayCommand(GuardarCategoriaGasto);
            this.newCommand = new RelayCommand(NuevaCategGasto);
            this.openCommand = new RelayCommand(AbrirCategoriaGasto);
        }

        private void NuevaCategGasto(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea crear una nueva categoría de gasto?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevaCategoriaGasto);
            }
        }

        private void AbrirCategoriaGasto(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar una categoría de gasto existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarCategoriaGasto);
            }
        }

        private void GuardarCategoriaGasto(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                if (Validaciones())
                {                                     
                    try
                    {

                        this.categoriaGasto.NombreCategoriaGasto = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.categoriaGasto.NombreCategoriaGasto);

                        if (categoriaGasto.IdCategoriaGasto == Guid.Empty) // Nueva categoría de Gasto
                        {
                            categoriaGasto.IdCategoriaGasto = Guid.NewGuid();
                            new CategoriaGastoLogica().Agregar(categoriaGasto);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La categoría de gasto ha sido guardada correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevaCategoriaGasto);

                        }
                        else // Modificación de La categoría de Gasto
                        {
                            new CategoriaGastoLogica().Modificar(categoriaGasto);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La categoría de gasto ha sido modificada correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevaCategoriaGasto);

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y la categoría de Gasto no se ha guardado");
                        nueva.ShowDialog();

                    }
                      
                }
                
            }
        }


        private bool Validaciones()
        {
            if (categoriaGasto.NombreCategoriaGasto == null || categoriaGasto.NombreCategoriaGasto == "")
            {
                if (categoriaGastoSinModificaciones != null)
                    this.categoriaGasto.NombreCategoriaGasto = this.categoriaGastoSinModificaciones.NombreCategoriaGasto;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre de la categoría de gasto' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }
            else
            {               
                bool nombreDuplicado = new CategoriaGastoLogica().VerificarNombreDuplicado(categoriaGasto.NombreCategoriaGasto, categoriaGasto.IdCategoriaGasto);

                if (nombreDuplicado)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Nombre de la categoría de gasto ya existe, debe elegir otro nombre");
                    nueva.ShowDialog();
                    return false;

                }               

            }

             if (categoriaGasto.DescripcionCategoriaGasto == null || categoriaGasto.DescripcionCategoriaGasto == "")
            {
                if (categoriaGastoSinModificaciones != null)
                    this.categoriaGasto.DescripcionCategoriaGasto = this.categoriaGastoSinModificaciones.DescripcionCategoriaGasto;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Descripción de categoría de gasto' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }           

            return true;
        }

















    }
}
